package gui;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import main.DatosProblema;

/**
 * Definicion del panel de nuevo problema.
 * 
 * @author age, joaquinmonleon
 *
 */
public class NuevoProblemaPanel extends JDialog {
	
	private static final long serialVersionUID = 2207409024305648312L;
	
	// Indica si al salir del panel se ha pulsado el boton aceptar
	public boolean AceptarPulsado;
	
	private KeyAdapter kaNumericField;
	
	private JPanel pPrincipal;
	private JPanel pPie;
	private JButton bAceptar;
	private JButton bCancelar;
	
	private JLabel lVariables;
	private JTextField tfVariables;
	private JLabel lRestricciones;
	private JTextField tfRestricciones;
	private JLabel lObjetivos;
	private JTextField tfObjetivos;
	private JLabel lOptimo;
	private JComboBox cbOptimo;

	public NuevoProblemaPanel() {
		super ();
		inicializarPanel ();
	}
	
	public NuevoProblemaPanel(PrincipalGUI principalGUI, String string, boolean b) {
		super (principalGUI, string, b);
		inicializarPanel ();
	}
	
	private void inicializarPanel () {

		kaNumericField = new KeyAdapter () {
			public void keyTyped(KeyEvent e) {
				// Verificar si la tecla pulsada no es un digito
				if(e.getKeyChar() < '0' || e.getKeyChar() > '9') {
					e.consume();
				}
			}
		};
		
		pPrincipal = new JPanel();
		pPrincipal.setLayout(Layout.getLayout());
		pPie = new JPanel ();
		bAceptar = new JButton("Aceptar");
		getRootPane().setDefaultButton(bAceptar);
		bAceptar.addActionListener(new Gestor());
		bCancelar = new JButton("Cancelar");
		bCancelar.addActionListener(new Gestor());
		
		lVariables = new JLabel("Variables");
		tfVariables = new JTextField();
		tfVariables.addKeyListener(kaNumericField);
		lRestricciones = new JLabel("Restricciones");
		tfRestricciones = new JTextField();
		tfRestricciones.addKeyListener(kaNumericField);
		lObjetivos = new JLabel("Objetivos");
		tfObjetivos = new JTextField();
		tfObjetivos.addKeyListener(kaNumericField);
		lOptimo = new JLabel("Optimo");
		cbOptimo = new JComboBox();
		
		Layout.addItem(0, 0, pPrincipal, lVariables);
		Layout.addItem(0, 1, pPrincipal, tfVariables);
		Layout.addItem(1, 0, pPrincipal, lRestricciones);
		Layout.addItem(1, 1, pPrincipal, tfRestricciones);
		Layout.addItem(2, 0, pPrincipal, lObjetivos);
		Layout.addItem(2, 1, pPrincipal, tfObjetivos);
		Layout.addItem(3, 0, pPrincipal, lOptimo);
		Layout.addItem(3, 1, pPrincipal, cbOptimo);
		
		pPie.add(bAceptar);
		pPie.add(bCancelar);
		
		getContentPane().add(pPrincipal, BorderLayout.CENTER);
		getContentPane().add(pPie, BorderLayout.SOUTH);
		this.pack();
		
		this.AceptarPulsado = false;
	}
	
	private void cargarDatos () {
		tfVariables.setText(DatosProblema.Variables.toString());
		tfRestricciones.setText(DatosProblema.Restricciones.toString());
		tfObjetivos.setText(DatosProblema.Objetivos.toString());
		
		tfObjetivos.setEnabled(false);
		
		DatosProblema.TOptimo[] tiposOpt = DatosProblema.TOptimo.values();
		cbOptimo.removeAllItems();
		for (int i=0; i<tiposOpt.length; i++) {
			cbOptimo.addItem(DatosProblema.OptimoText(tiposOpt[i]));
			
			if (DatosProblema.Optimo == tiposOpt[i])
				cbOptimo.setSelectedIndex(i);
		}
	}
	
	public void cargarPanel () {
		this.AceptarPulsado = false;
		cargarDatos ();
		setVisible(true);
	}

	private class Gestor implements ActionListener {
		public Gestor() {}
		public void actionPerformed(ActionEvent e) {
	   		if (e.getSource() == bAceptar) {	   			
	   			setVisible(false);
	   			DatosProblema.guardar(
	   					Integer.parseInt( tfVariables.getText() ), 
	   					Integer.parseInt( tfRestricciones.getText() ), 
	   					Integer.parseInt( tfObjetivos.getText() ), 
	   					DatosProblema.OptimoValue( cbOptimo.getSelectedItem().toString() )
	   				);
	   			AceptarPulsado = true;		   			
	   		} else if ((e.getSource() == bCancelar)) {
	   			setVisible(false);
	   		}
	   	}
	}
}
